<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<body>
<canvas id="canvas" width="200" height="200"></canvas>
<script>

var ctx = document.getElementById('canvas').getContext('2d');

function checkResult(expectedColors, sigma) {
    data = ctx.getImageData(50, 50, 1, 1).data;
    for (var i = 0; i < 4; i++)
        assert_approx_equals(data[i], expectedColors[i], sigma);
}

function drawRectanglesOn(contextOrPath) {
    contextOrPath.rect(0, 0, 100, 100);
    contextOrPath.rect(25, 25, 50, 50);
}

function testClipWith(fillRule, path) {
    ctx.fillStyle = 'rgb(255,0,0)';
    ctx.beginPath();
    ctx.fillRect(0, 0, 100, 100);
    ctx.fillStyle = 'rgb(0,255,0)';
    if (path) {
        if (fillRule) {
            ctx.clip(path, fillRule);
        } else {
            ctx.clip(path);
        }
    } else {
        ctx.beginPath();
        drawRectanglesOn(ctx);
        if (fillRule) {
            ctx.clip(fillRule);
        } else {
            ctx.clip();
        }
    }
    ctx.beginPath();
    ctx.fillRect(0, 0, 100, 100);
    if (fillRule == 'evenodd') {
        checkResult([255, 0, 0, 255], 5);
    } else {
        checkResult([0, 255, 0, 255], 5);
    }
}

test(function(t) {
    fillRules = [undefined, 'nonzero', 'evenodd'];
    path = new Path2D();
    drawRectanglesOn(path);

    for (var i = 0; i < fillRules.length; i++) {
       testClipWith(fillRules[i]);
       testClipWith(fillRules[i], path);
    }

    // Test exception cases.
    assert_throws_js(TypeError, function() {
      ctx.clip(null);
    });
    assert_throws_js(TypeError, function() {
      ctx.clip(null, null);
    });
    assert_throws_js(TypeError, function() {
      ctx.clip(null, 'nonzero');
    });
    assert_throws_js(TypeError, function() {
      ctx.clip(path, null);
    });
    assert_throws_js(TypeError, function() {
      ctx.clip([], 'nonzero');
    });
    assert_throws_js(TypeError, function() {
      ctx.clip({}, 'nonzero');
    });
    assert_throws_js(TypeError, function() {
      ctx.clip(null, 'evenodd');
    });
    assert_throws_js(TypeError, function() {
      ctx.clip([], 'evenodd');
    });
    assert_throws_js(TypeError, function() {
      ctx.clip({}, 'evenodd');
    });
    assert_throws_js(TypeError, function() {
      ctx.clip('gazonk');
    });
    assert_throws_js(TypeError, function() {
      ctx.clip(path, 'gazonk');
    });
    assert_throws_js(TypeError, function() {
      ctx.clip(undefined, undefined);
    });
    assert_throws_js(TypeError, function() {
      ctx.clip(undefined, 'nonzero');
    });
}, 'Series of tests to ensure clip() works with path and winding rule parameters.');
</script>
</body>
